spring boot 接口并发锁处理 springboot 并发调优

您所在的位置:网站首页 springboot 并发调优 spring boot 接口并发锁处理 springboot 并发调优

spring boot 接口并发锁处理 springboot 并发调优

2023-11-10 10:46| 来源: 网络整理| 查看: 265

通过压测可以找到服务器的上限, ps -ef |grep java找到java的进程号,然后通过pstree -p 12569 | wc -l可以看到当前java的线程数。当我们的压测到达一定数量的时候,请求会报错:

spring boot 接口并发锁处理 springboot 并发调优_spring boot 接口并发锁处理

这是可以去看下线程数:

spring boot 接口并发锁处理 springboot 并发调优_spring boot 接口并发锁处理_02

也就是由于server端并发线程数上不去,导致客户端请求被拒。

首先看下spring-configuration-metadata.json文件,springboot内嵌tomcat容器后,很多配置都在这里,比如:

spring boot 接口并发锁处理 springboot 并发调优_java_03

其中,我们需要注意以下参数:

server.tomcat.accept-count:等待队列长度,默认100

server.tomcat.max-connections:最大可被连接数,默认10000

server.tomcat.max-threads:最大工作线程数,默认200

server.tomcat.min-spare-threads:最小工作线程数,默认10

在默认配置下,当连接超过10000后会出现拒绝连接的情况,当并发请求数量超过200+100的时候会拒绝处理。

所以我们可以适当地增加参数:

spring boot 接口并发锁处理 springboot 并发调优_java_04

重启后可以看到,线程数变多了

spring boot 接口并发锁处理 springboot 并发调优_tomcat_05

这时再进行压测,再看线程数:

spring boot 接口并发锁处理 springboot 并发调优_tomcat_06

通过top -H可以看到,资源都在mysql和java上

spring boot 接口并发锁处理 springboot 并发调优_tomcat_07

再看下参数,平均值是非常高的,看吞吐量也可以看出只能承受两百多,这当然是不行的。

spring boot 接口并发锁处理 springboot 并发调优_spring boot 接口并发锁处理_08

 

接下来我们需要知道tomcat的keepAlive,这是长连接,也就是客户端请求完服务端后,连接并不断开,这么做的好处是降低了客户端请求服务端建立、断开连接所消耗的时间,当然也会消耗资源,但由于现在与服务端交互越来越频繁,所以长连接也很有必要,但为了保证资源,所以长连接的失效时间也是需要注意的。

keepAliveTimeOut:多少毫秒后不响应的断开keepalive

maxKeepAliveRequests:多少次请求后keepalive断开失效

但由于spring-configuration-metadata.json中并没有关于keepalive的设置,所以我们需要自己通过代码来定制。

/** * 当spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把此bean加载进spring容器中 */ @Component public class WebServerConfiguration implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { //使用对应工厂类定制化tomcat connector ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); //定制化keepalivetimeout,30秒 protocol.setKeepAliveTimeout(30000); //客户端发送超过10000个请求自动断开 protocol.setMaxKeepAliveRequests(10000); } }); } }

 

对于单web容器上线:

线程数量:4核8G内存单进程调度线程数在800-1000,1000以上会花费大量时间在cpu调度上。

等待队列长度:队列做缓冲池用,但也不能无限长,因为缓冲区也会消耗内存,出队入队也都消耗cpu。

而对于数据库而言,建立索引也会大大提高查询效率,出了插入以外都是一样。对于插入操作后面会进行处理。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3